from django.contrib.auth import authenticate
# authenticate   默认用户名登陆

# 我们需要在添加一个手机号登陆


from django.contrib.auth.backends import ModelBackend

from apps.users.models import User
import re
# 有异常记录到日志
import logging
logger = logging.getLogger("django")
'''
封装/抽取
为什么要封装/抽取
    1.降低代码的耦合度
    2.降低代码量
封装/抽取方法
    1.将要封装的代码复制到一个函数
    2.哪里有问题，改哪里，没有变量以参数的形式传递
    注意是否需要有返回值
    3.验证代码（先注释原有代码，没问题在删除）

什么时候封装/抽取
    1.只要完成某一个功能，就可以封装/抽取
    2.只要第二次使用到的重复代码，就封装/抽取


'''
def get_user_by_usernamemobile(username):
    try:
        # 1 先区分手机号和用户名
        if re.match(r"1[3-9]\d{9}", username):
            # 手机号登陆
            user = User.objects.get(mobile=username)

        else:
            # 用户名登陆
            user = User.objects.get(username=username)
    except Exception as e:
        logger.error(e)
        return None
    else:
        return user

class UsernameMobileModelBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        # def authenticate处加后台登录判断
        if request is None:
        # 后台登录
            try:
                if re.match(r"1[3-9]\d{9}",username):
                    # 手机登录
                    user = User.objects.get(mobile=username, is_staff=True)
                else:
                    # 用户登录
                    user = User.objects.get(username=username, is_staff=True)
            except:
                user = None
            if user is not None and user.check_password(password):
                return user
        else:

            # 可以删除此处
            # try:
            #     # 1 先区分手机号和用户名
            #     if re.match(r"1[3-9]\d{9}",username):
            #         # 手机号登陆
            #         user = User.objects.get(mobile=username)
            #
            #     else:
            #     # 用户名登陆
            #         user = User.objects.get(username=username)
            # except Exception as e:
            #     logger.error(e)
            #     return None

            # else:


            # 1.就要一个用户名
            user = get_user_by_usernamemobile(username)
                # 2.检查密码
            if user is not None and user.check_password(password):
                return user


